昨天我們學到了Go 語言 值與指標 (pointers) ,今天繼續來了解常數 (constants) 、列舉 (enums) 與變數作用範圍 (scope) 吧!
常數跟變數其實常常拿來一起說明,因為兩者的差異只在於,常數在定義之後是 無法修改初始值 的。
而常數的宣告我們只需要把變數的 var 換成 const ,前面有說過因為初始值不可修改,所以在宣告常數時,也要給初始值,而這個初始值可以是一個 值 、 運算式 ,也可以是其他的 常數 。
範例 4:
package main
import "fmt"
const TWCountryCode = "+886" // 台灣的手機國碼是 +886 ,這目前是固定的數,所以我們將他定義為常數
func setCellphone(number string)string{
return (TWCountryCode+number) // 將傳入的手機號碼加上國碼
}
func main (){
fmt.Println(setCellphone("987654321")) // 寫入資料並印出含有國碼的手機號碼
}
範例 4(執行結果):
+886987654321
定義多個值是整數的常數,而這些常數會彼此相關,在 Go 語言中提供一種稱為 iota 的小工具,來簡化彼此相關且值為遞增的列舉。 好了又開始聽不懂了,請說白話文...
簡單來說 iota 預設值是 0,每次當 const 呼叫宣告時,就會加 1,直到遇到下一個 const 宣告 iota 時,才會重置為 0。
範例 5(執行結果):
package main
import "fmt"
const (
zero = iota // 預設值是 0
one // 會自動加一,所以為 2(以下依此類推)
two
three
four
)
const (
Sunday = iota // 重新宣告一個 const 時,iota 會重置為 0
Monday
Tuesday
)
func main() {
fmt.Println(zero,one,two,three,four,Sunday,Monday,Tuesday)
}
範例 5(執行結果):
0 1 2 3 4 0 1 2
Go 語言中,所有變數都有運作的 範圍 (Scope) ,或稱為 層級 、 作用域 ,其中最上層的範圍是 套件(package) ,而每個 Scope 裡又可以包含其他的子 Scope ,而找到子 Scope 很簡單,就是 { } 內的變數都屬於子範圍內的變數。
當執行程式碼時要取得變數時,會先在當個範圍內尋找,若是子 Scope 裡沒有該變數,則會往上層尋找,若一路找到最上層 package 還是找不到,則會報錯。
補充:
若是找到同名但是型別不同的變數,也是會報錯的喔!
範例 6:
package main
import "fmt"
var favoriteFruit = "kiwi" // 在最外層宣告最愛的水果是 kiwi
func main() {
fmt.Println("package main favorite:", favoriteFruit) // 程式碼執行到這時,func main 還沒有同名 favoriteFruit 這個變數,所以找到外層的 kiwi
favoriteFruit := "apple" // 在 func main 內更改變數值為 apple
if true {
favoriteFruit := "peach" // 在 if block 內更改變數值為 peach
fmt.Println("if block favorite:", favoriteFruit) // 因為在 if block 內有找到favoriteFruit,所以可以直接印出值為 peach
fruit() // 呼叫 func fruit
}
fmt.Println("func main favorite:", favoriteFruit) // 雖然順序在 if block 下會有點讓人誤會,但是仔細劃分好區域,會發現它的 scope 是在 func main 內的,所以找到值為 apple
}
func fruit(){
favoriteFruit := "mango" // 在 func fruit 內更改變數值為 mango
fmt.Println("func fruit favorite:", favoriteFruit) // 這邊 func fruit 又是自己的 scope ,無論在哪裡呼叫,他會先找到最近的 favoriteFruit ,也就是 mango
}
範例 6(執行結果):
package main favorite: kiwi
if block favorite: peach
func fruit favorite: mango
func main favorite: apple
補充:
當我們在定義變數時,可以先想到此變數的作用範圍,再決定要將變數定義在哪,如此一來可以更精準控制每一個變數。
雖然一開始對於變數的 scope 可能會比較陌生,但是當把每個 scope 拆分畫出來,就可以很清楚知道,到哪裡該找誰,我都是記為有近的找近的,沒有往外找,在沒有就錯啦!
明天我們要來學習邏輯判斷,也就是前面有些範例已經偷偷出現過的 if...else...
,那我們明天見~